package com.shujia

import java.io.{BufferedReader, FileReader, FileWriter, PrintWriter}
import java.sql.{Connection, DriverManager, PreparedStatement, ResultSet}
import scala.io.{BufferedSource, Source}

object Demo2ScalaBase {
  /**
   * def 定义一个函数
   * main 方法名
   * args: Array[String] 参数名:参数类型
   * Unit 返回值类型，相当于Java中的void
   * {} 方法体
   *
   */
  def main(args: Array[String]): Unit = {
    // 1、变量的定义
    /**
     * val : 修饰不可变的
     * var ： 修饰可变的
     * 都不需要限定类型，可以直接通过等号右边自动进行推断
     */

    val i = 10
    println(i)
    //    i = 11 // 变量i是用val修饰的，不能重新赋值

    var j = 100
    println(j)
    j = 200
    println(j)

    // 类型可以自动推断，也可以手动指定
    //    val k: Float = 1.1f

    // 2、基本数据类型
    val byte1: Byte = 1
    val short1: Short = 1
    val int1: Int = 1
    val long1: Long = 1

    val float1: Float = 1
    val double1: Double = 1

    val bool1: Boolean = true
    val bool2: Boolean = false

    val char1: Char = 'a'

    // 字符串类型：引用类型
    // 底层同Java中的String一样，但是新增了很多Scala的方法
    // 隐式转换：给对象动态增加方法
    val str: String = "Java Scala Python"

    // 字符串常见的方法
    val splits: Array[String] = str.split(" ")
    println(splits(0))
    println(splits(1))
    println(splits(2))

    // 拼接字符串
    val str1: String = "abcd"
    val str2: String = "efgh"

    // 直接 +
    val str3: String = str1 + "," + str2
    println(str3)

    // 使用StringBuilder
    val builder: StringBuilder = new StringBuilder()
    builder.append("abcd")
    builder.append(",")

    builder append "efgh"

    println(builder)

    // scala的方式
    // $str1取str1的值
    val _str4: String = "jklmn"
    println(s"${str1.length},${str2},${_str4}")

    // Int to String
    val int2: Int = 10
    val str4: String = String.valueOf(int2)
    println(str4)


    // String to Int
    val str5: String = "12345"
    val int3: Int = Integer.parseInt(str5)
    println(int3)
    val ds: Double = str5.toDouble
    println(ds)

    // Scala的类型转换
    // 调用"to类型"方法
    val int4: Int = 1024
    val s1: String = int4.toString
    val d1: Double = int4.toDouble
    val f1: Float = int4.toFloat

    println(10 * 20)
    println("*" * 100)

    // 单行注释
    /*
    多行注释
     */
    /**
     * 文档注释
     */

    // 选择结构
    if (18 > 20) {
      println("18 比 20 大")
    } else if (18 == 20) {
      println("18 等于 20")
    } else {
      println("18 小于 20")
    }

    // 循环结构
    // while do
    // 计算1~100的和
    var cnt: Int = 1
    var sum: Int = 0
    while (cnt <= 100) {
      sum += cnt
      cnt += 1
    }
    println(sum)

    // do while
    // 至少会执行一次
    do {
      println("不管while条件成不成立 至少都会执行一次")
    } while (false)

    // for 循环
    // 跟python类似，用于遍历
    // 相当于Java中的 for each
    val strN: String = "1,2,3,4,5,6,7,8,9"
    val list: List[String] = strN.split(",").toList
    // 类似Java中遍历方式
    for (str <- list) {
      println(str)
    }

    // 在Scala中采取函数式编程的思想进行遍历
    list.foreach(println)
    println("*" * 100)
    // 文件的读写
    // Java的方式
    val br: BufferedReader = new BufferedReader(new FileReader("Scala/data/students.txt"))

    var line: String = br.readLine()
    while (line != null) {
      System.out.println(line)
      line = br.readLine()
    }
    println("*" * 100)
    // Scala 的方式
    val source: BufferedSource = Source.fromFile("Scala/data/students.txt")
    val lines: Iterator[String] = source.getLines()
    for (elem <- lines) {
      println(elem)
    }
    println("*" * 100)
    // 简写的方式
    // 链式调用
    Source
      .fromFile("Scala/data/students.txt")
      .getLines()
      .foreach(println)

    // 在Scala中没有特有的方式，使用的是Java的IO类
    //    PrintWriter
    //    FileWriter


    // 操作MySQL
    // 建立连接
    val conn: Connection = DriverManager.getConnection("jdbc:mysql://master:3306/student", "root", "123456")

    // 创建statement
    val st: PreparedStatement = conn.prepareStatement("select * from student where clazz=?")

    // 设置参数
    st.setString(1, "理科五班")
    // 执行SQL 获取结果
    val rs: ResultSet = st.executeQuery()
    while (rs.next()) {
      val id: Int = rs.getInt("id")
      val name: String = rs.getString("name")
      val clazz: String = rs.getString("clazz")
      val gender: String = rs.getString("gender")
      val last_mod: String = rs.getString("last_mod")
      val age: Int = rs.getInt("age")
      println(s"${id},${name},${clazz},${gender},${age},${last_mod}")
    }

    // 关闭连接
    st.close()
    conn.close()


  }

}
